
// 对象初始化

// new Object()， Object.create()，或者使用字面量标记（初始化标记）初始化对象

// var obj = {};
// obj.a = 1;

// var newObj = new Object(obj);

// console.log(obj === newObj); // true 无意义

// var arr = [];
// arr.a = 1; // [a: 1] -> length: 0

// var arr = [1, 2, 3, 4];
// arr.a = 1;

// console.log(arr);
// console.log(arr.a); // 1

// var arr = [1, 2, 3, 4];
// var newArr = new Object(arr); // true
// var newArr = new Array(arr); // false
// var newArr = new Array(arr, 5, 6);

// console.log(arr === newArr);
// console.log(newArr);

// var a = 1;

// a.b = 2;
// console.log(a); // 1
// console.log(a.b); // undefined

// var str = '123';
// console.log(str.__proto__);
// console.log(str.__proto__ === String.prototype); // true
// var newStr = new String(str);
// console.log(newStr);
// console.log(newStr == str); // true
// console.log(newStr === str); // false

var a = 1;
var newA = new Number(a);
console.log(newA); // 引用值
console.log(newA == a); // true 包装类 类型转换
console.log(newA === a); // false  原始值 不能和 引用值对比，

// 所有原始值在底层都是构造函数构造出来的，所有属性都是继承来的

/**
 * function Array Object -> 引用值 -> (继承)Object.prototype
 * 
 * 如果给定值是 null 或 undefined，将会创建并返回一个空对象
 * 
 * 如果传进去的是一个基本类型的值，则会构造其包装类型的对象
 * 
 * 如果传进去的是引用类型的值，仍然会返回这个值，经他们复制的变量保有和源对象相同的引用地址
 * 
 * 当以非构造函数形式被调用时，Object 的行为等同于 new Object()
 */

